﻿/*
LICENCE___________________________________________________________________
    Copyright (C) 2012 Reverdy Sylvain

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
FIN LICENCE______________________________________________________________
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;

using System.Windows.Controls;
using Merise_designer.Objets;

namespace Merise_designer.Methodes
{
    public class Lignes
    {

        private List<CL_Line> mLignes;
        private Donnees.CL_Lignes datatLigne = new Donnees.CL_Lignes();
        private ObjetsCommun controlleur;

        public Lignes(ObjetsCommun controlleur, Grid grille)
        {
            this.controlleur = controlleur;
            this.mLignes = new List<CL_Line>();
        }
        public void load(Grid grille)
        {
            //Chargement des lignes
            String jeu = "monjeu";
            Donnees.CL_Lignes ligneData = new Donnees.CL_Lignes();
            System.Data.DataSet lignes = new System.Data.DataSet();
            lignes = ligneData.selectAll(jeu);

            foreach (System.Data.DataRow theRow in lignes.Tables[jeu].Rows)
            {
                //Créé l'association
                Objets.CL_Entite entite = controlleur.getEntite((string)theRow["ID_ENTITE"]);
                Objets.CL_Association association = controlleur.getAssociation((string)theRow["ID_ASSO"]);
                this.AddLoad(grille, (string)theRow["ID_LIGNE"], entite, association, (string)theRow["CARDINALITE"]);
            }

        }
        public void Add(Grid grille, CL_Entite ent, CL_Association asso)
        {
            this.mLignes.Add(new CL_Line(controlleur, grille, CL_Variables.addNameAuto(), ent, asso));
            if (Mode.mode_save == Mode.MODE_SAVE_AUTO)
            {
                //Enregistrement dans la base
                datatLigne.add(mLignes.Last());
            }
        }
        public void AddLoad(Grid grille, string id, CL_Entite ent, CL_Association asso, string cardinalite)
        {
            this.mLignes.Add(new CL_Line(controlleur, grille, id, ent, asso, cardinalite));
        }
        public void Del(Grid grille, CL_Entite entite, CL_Association asso)
        {
            int[] idToDel = new int[mLignes.Count];
            int j = 0;

            //Supprime les lignes assosiées à l'entité
            for (int i = 0; i < mLignes.Count; i++)
            {
                if (mLignes[i].IsConnectedToEntite(entite) || mLignes[i].IsConnectedToAssociation(asso))
                {
                    if (Mode.mode_save == Mode.MODE_SAVE_AUTO)
                    {
                        //supprime de la base
                        datatLigne.delete(mLignes[i].Id);
                    }
                    mLignes[i].Supprimer(grille); //supprime l'objet de la grille
                    idToDel[j] = i; //mémorie l'objet supprimé dans une liste
                    j++;
                }
            }

            //***Supprime les éléments du le liste***

            //Récupère la liste d'objets à supprimer en une collection d'objets
            CL_Line[] lineToDel = new CL_Line[j];
            for (int i = 0; i < j; i++)
            {
                lineToDel[i] = mLignes[idToDel[i]];
            }

            //Supprime les objets de la liste
            for (int i = 0; i < j; i++)
            {
                mLignes.Remove(lineToDel[i]);
            }

        }
        public void Del(Grid grille, CL_Line line)
        {
            if (Mode.mode_save == Mode.MODE_SAVE_AUTO)
            {
                //supprime de la base
                datatLigne.delete(line.Id);
            }
            line.Supprimer(grille); //supprime l'objet de la grille
            mLignes.Remove(line);
        }
        public void move(CL_Entite entite, CL_Association asso)
        {
            for (int i = 0; i < mLignes.Count; i++)
            {
                if (mLignes[i].IsConnectedToEntite(entite) || mLignes[i].IsConnectedToAssociation(asso))
                {
                    mLignes[i].move(entite, asso);
                }
            }
        }
        public bool isLineOf(CL_Entite entite, CL_Association asso)
        {
            for (int i = 0; i < mLignes.Count; i++)
            {
                if (mLignes[i].IsConnectedToEntite(entite) & mLignes[i].IsConnectedToAssociation(asso))
                {
                    return true;
                }
            }
            return false;
        }
        public List<CL_Line> getAllLines()
        {
            return this.mLignes;
        }
        public void saveUpdate(CL_Entite entite, CL_Association asso, Boolean force)
        {
            for (int i = 0; i < mLignes.Count; i++)
            {
                if (mLignes[i].IsConnectedToEntite(entite) || mLignes[i].IsConnectedToAssociation(asso) || force)
                {
                    if (Mode.mode_save == Mode.MODE_SAVE_AUTO)
                    {
                        datatLigne.update(mLignes[i]);
                    }
                }
            }
        }
        public CL_Line getLast()
        {
            return this.mLignes.Last();
        }

        /// <summary>
        /// Supprime les lignes en double
        /// </summary>
        public void cleanDoublons()
        {
            //Créé la liste sans doublons 
            List<CL_Line> listeAvecDoublons = new List<CL_Line>();
            listeAvecDoublons.AddRange(mLignes);
            List<CL_Line> listeSansDoublons = new List<CL_Line>();
            for (int i=0 ; i<listeAvecDoublons.Count ; i++)
            {
                if (!listeSansDoublons.Contains(listeAvecDoublons[i]))
                {
                    listeSansDoublons.Add(listeAvecDoublons[i]);
                }
            }

            //supprime toutes les lignes existances
            foreach (CL_Line l in listeAvecDoublons)
            {
                this.controlleur.DelLine(l);
            }

            //Re-Génère les lignes sans doublons
            foreach (CL_Line l in listeSansDoublons)
            {
                this.controlleur.AddLigne(this.controlleur.getEntite(l.IdEntite), this.controlleur.getAssociation(l.IdAssociation));
                this.getLast().Cardinalite = l.Cardinalite;
            }

        }
    }
}
